import microApp from '@micro-zoe/micro-app';

declare global {
  interface Window {
    microApp?: any;
    __MICRO_APP_ENVIRONMENT__?: boolean;
    __MICRO_APP_NAME__?: string;
  }
}

/**
 * 发送数据到子应用（参照PC端实现）
 *
 * @param name 子应用名称
 * @param data 要发送的数据
 * @returns 返回Promise
 */
export function dispatch(name: string, data: any): Promise<any> {
  return new Promise((resolve, reject) => {
    try {
      console.log(`dispatch 发送数据到子应用 ${name}:`, data);

      microApp.setData(name, data, (res: any) => {
        console.log('dispatch 响应:', res);

        // 检查res是否为数组，如果是则取第一个元素
        const result = Array.isArray(res) ? res[0] : res;

        if (result && typeof result.then === 'function') {
          result.then(resolve).catch(reject);
        } else {
          resolve(result);
        }
      });
    } catch (error) {
      console.error(`dispatch 发送数据到子应用 ${name} 失败:`, error);
      reject(error);
    }
  });
}

/**
 * 重新加载子应用
 *
 * @param name 子应用名称
 * @param destroy 是否销毁后重新创建
 */
export function reload(name: string, destroy = true): void {
  try {
    console.log(`重新加载子应用 ${name}, destroy: ${destroy}`);
    microApp.reload(name, destroy);
  } catch (error) {
    console.error(`重新加载子应用 ${name} 失败:`, error);
    throw error;
  }
}

/**
 * 检查是否在微应用环境中
 *
 * @returns 是否在微应用环境中
 */
export function isMicroAppEnvironment(): boolean {
  if (typeof window === 'undefined') {
    return false;
  }

  return !!(window.__MICRO_APP_ENVIRONMENT__ || window.microApp);
}

/**
 * 获取当前微应用名称
 *
 * @returns 微应用名称，如果不在微应用环境中则返回空字符串
 */
export function getMicroAppName(): string {
  if (typeof window === 'undefined') {
    return '';
  }

  try {
    return window.__MICRO_APP_NAME__ || '';
  } catch (error) {
    console.error('获取微应用名称失败:', error);
    return '';
  }
}

/**
 * 获取微应用数据
 *
 * @param appName 应用名称，如果不传则获取当前应用数据
 * @returns 微应用数据
 */
export function getMicroAppData(appName?: string): any {
  try {
    if (appName) {
      // 获取指定应用的数据
      return microApp.getData(appName);
    } else {
      // 获取当前应用的数据
      if (typeof window !== 'undefined' && window.microApp?.getData) {
        return window.microApp.getData();
      }
    }
    return null;
  } catch (error) {
    console.error('获取微应用数据失败:', error);
    return null;
  }
}

/**
 * 设置微应用数据
 *
 * @param appName 应用名称
 * @param data 要设置的数据
 */
export function setMicroAppData(appName: string, data: any): void {
  try {
    console.log(`设置微应用 ${appName} 数据:`, data);
    microApp.setData(appName, data);
  } catch (error) {
    console.error(`设置微应用 ${appName} 数据失败:`, error);
    throw error;
  }
}

/**
 * 获取全局数据
 *
 * @returns 全局数据
 */
export function getGlobalData(): any {
  try {
    if (typeof window !== 'undefined' && window.microApp?.getGlobalData) {
      return window.microApp.getGlobalData();
    }
    return microApp.getGlobalData?.() || null;
  } catch (error) {
    console.error('获取全局数据失败:', error);
    return null;
  }
}

/**
 * 设置全局数据
 *
 * @param data 要设置的全局数据
 */
export function setGlobalData(data: any): void {
  try {
    console.log('设置全局数据:', data);

    if (typeof window !== 'undefined' && window.microApp?.setGlobalData) {
      window.microApp.setGlobalData(data);
    } else {
      microApp.setGlobalData?.(data);
    }
  } catch (error) {
    console.error('设置全局数据失败:', error);
    throw error;
  }
}

/**
 * 获取所有活跃的微应用名称列表
 *
 * @returns 活跃的微应用名称列表
 */
export function getActiveApps(): string[] {
  try {
    return microApp.getActiveApps?.() || [];
  } catch (error) {
    console.error('获取活跃应用列表失败:', error);
    return [];
  }
}

/**
 * 挂载微应用
 * 注意：@micro-zoe/micro-app 主要通过组件方式挂载，此方法主要用于文档示例
 *
 * @param appName 应用名称
 * @param url 应用地址
 * @param options 配置选项
 */
export function mountApp(
  appName: string,
  url: string,
  options?: {
    baseroute?: string;
    data?: any;
    [key: string]: any;
  },
): void {
  try {
    console.log(`挂载微应用 ${appName}, url: ${url}`, options);
    console.warn(
      'mount 方法主要用于文档示例，实际使用时请使用组件方式挂载微应用，如 <BasicMicroApp />',
    );

    // 注意：@micro-zoe/micro-app 主要使用组件方式挂载
    // 如果要动态挂载微应用，请使用 React 组件方式或通过 DOM 操作
    if (typeof window !== 'undefined') {
      console.warn('建议使用 <BasicMicroApp /> 组件方式挂载微应用');
    }
  } catch (error) {
    console.error(`挂载微应用 ${appName} 失败:`, error);
    throw error;
  }
}

/**
 * 卸载指定微应用
 *
 * @param appName 应用名称
 * @param destroy 是否完全销毁
 */
export function unmountApp(appName: string, destroy = false): void {
  try {
    console.log(`卸载微应用 ${appName}, destroy: ${destroy}`);
    microApp.unmountApp?.(appName, { destroy });
  } catch (error) {
    console.error(`卸载微应用 ${appName} 失败:`, error);
    throw error;
  }
}

/**
 * 预加载微应用
 *
 * @param apps 要预加载的应用配置
 */
export function preFetch(apps: Array<{ name: string; url: string }>): void {
  try {
    console.log('预加载微应用:', apps);
    microApp.preFetch?.(apps);
  } catch (error) {
    console.error('预加载微应用失败:', error);
    throw error;
  }
}

/**
 * 检查微应用是否存在
 *
 * @param appName 应用名称
 * @returns 是否存在
 */
export function hasApp(appName: string): boolean {
  try {
    const activeApps = getActiveApps();
    return activeApps.includes(appName);
  } catch (error) {
    console.error(`检查微应用 ${appName} 是否存在失败:`, error);
    return false;
  }
}

/**
 * 清理所有微应用
 */
export function clearAllApps(): void {
  try {
    console.log('清理所有微应用');
    const activeApps = getActiveApps();
    activeApps.forEach((appName) => {
      unmountApp(appName, true);
    });
  } catch (error) {
    console.error('清理所有微应用失败:', error);
    throw error;
  }
}
